import { defHttp } from '/@/utils/http/axios';
import { ref, unref } from 'vue';
import { VALIDATE_FAILED, validateFormModelAndTables } from '/@/utils/common/vxeUtils';
export function useJvxeMethod(requestAddOrEdit, classifyIntoFormData, tableRefs, activeKey, refKeys, validateSubForm) {
    const formRef = ref();
    /** 查询某个tab的数据 */
    function requestSubTableData(url, params, tab, success) {
        tab.loading = true;
        defHttp
            .get({ url, params }, { isTransformResponse: false })
            .then((res) => {
            let { result } = res;
            if (res.success && result) {
                if (Array.isArray(result)) {
                    tab.dataSource = result;
                }
                else if (Array.isArray(result.records)) {
                    tab.dataSource = result.records;
                }
            }
            typeof success === 'function' ? success(res) : '';
        })
            .finally(() => {
            tab.loading = false;
        });
    }
    /* --- handle 事件 --- */
    /** ATab 选项卡切换事件 */
    function handleChangeTabs(key) {
        // 自动重置scrollTop状态，防止出现白屏
        tableRefs[key]?.value?.resetScrollTop(0);
    }
    /** 获取所有的editableTable实例*/
    function getAllTable() {
        let values = Object.values(tableRefs);
        return Promise.all(values);
    }
    /** 确定按钮点击事件 */
    function handleSubmit() {
        /** 触发表单验证 */
        getAllTable()
            .then((tables) => {
            let values = formRef.value.getFieldsValue();
            return validateFormModelAndTables(formRef.value.validate, values, tables, formRef.value.getProps, false);
        })
            .then((allValues) => {
            /** 一次性验证一对一的所有子表 */
            return validateSubForm && typeof validateSubForm === 'function' ? validateSubForm(allValues) : validateAllSubOne(allValues);
        })
            .then((allValues) => {
            if (typeof classifyIntoFormData !== 'function') {
                throw throwNotFunction('classifyIntoFormData');
            }
            let formData = classifyIntoFormData(allValues);
            // 发起请求
            return requestAddOrEdit(formData);
        })
            .catch((e) => {
            if (e.error === VALIDATE_FAILED) {
                // 如果有未通过表单验证的子表，就自动跳转到它所在的tab
                //update-begin-author:taoyan date:2022-11-22 for: VUEN-2866【代码生成】Tab风格 一对多子表校验不通过时，点击提交表单空白了，流程附加页面也有此问题
                if (e.paneKey) {
                    activeKey.value = e.paneKey;
                }
                else {
                    activeKey.value = e.index == null ? unref(activeKey) : refKeys.value[e.index];
                }
                //update-end-author:taoyan date:2022-11-22 for: VUEN-2866【代码生成】Tab风格 一对多子表校验不通过时，点击提交表单空白了，流程附加页面也有此问题
            }
            else {
                console.error(e);
            }
        });
    }
    //校验所有子表表单
    function validateAllSubOne(allValues) {
        return new Promise((resolve) => {
            resolve(allValues);
        });
    }
    /* --- throw --- */
    /** not a function */
    function throwNotFunction(name) {
        return `${name} 未定义或不是一个函数`;
    }
    /** not a array */
    function throwNotArray(name) {
        return `${name} 未定义或不是一个数组`;
    }
    return [handleChangeTabs, handleSubmit, requestSubTableData, formRef];
}
//update-begin-author:taoyan date:2022-6-16 for: 代码生成-原生表单用
/**
 * 校验多个表单和子表table，用于原生的antd-vue的表单
 * @param activeKey 子表表单/vxe-table 所在tabs的 activeKey
 * @param refMap 子表表单/vxe-table对应的ref对象 map结构
 * 示例：
 * useValidateAntFormAndTable(activeKey, {
 *   'tableA': tableARef,
 *   'formB': formBRef
 * })
 */
export function useValidateAntFormAndTable(activeKey, refMap) {
    /**
     * 获取所有子表数据
     */
    async function getSubFormAndTableData() {
        let formData = {};
        let all = Object.keys(refMap);
        let key = '';
        for (let i = 0; i < all.length; i++) {
            key = all[i];
            let instance = refMap[key].value;
            if (instance.isForm) {
                let subFormData = await validateFormAndGetData(instance, key);
                if (subFormData) {
                    formData[key + 'List'] = [subFormData];
                }
            }
            else {
                let arr = await validateTableAndGetData(instance, key);
                if (arr && arr.length > 0) {
                    formData[key + 'List'] = arr;
                }
            }
        }
        return formData;
    }
    /**
     * 转换数据用 如果有数组转成逗号分割的格式
     * @param data
     */
    function transformData(data) {
        if (data) {
            Object.keys(data).map((k) => {
                if (data[k] instanceof Array) {
                    data[k] = data[k].join(',');
                }
            });
        }
        return data;
    }
    /**
     * 子表table
     * @param instance
     * @param key
     */
    async function validateTableAndGetData(instance, key) {
        const errors = await instance.validateTable();
        if (!errors) {
            return instance.getTableData();
        }
        else {
            activeKey.value = key;
            // 自动重置scrollTop状态，防止出现白屏
            instance.resetScrollTop(0);
            return Promise.reject(1);
        }
    }
    /**
     * 子表表单
     * @param instance
     * @param key
     */
    async function validateFormAndGetData(instance, key) {
        try {
            let data = await instance.getFormData();
            transformData(data);
            return data;
        }
        catch (e) {
            activeKey.value = key;
            return Promise.reject(e);
        }
    }
    return {
        getSubFormAndTableData,
        transformData,
    };
}
//update-end-author:taoyan date:2022-6-16 for: 代码生成-原生表单用
